﻿
using System;
using System.IO;
using MinGuiLuo.Configuation;

namespace MinGuiLuo
{
    /// <summary>
    /// OEA 的上下文环境
    /// </summary>
    public static partial class LEnvironment
    {
        #region Provider

        private static EnvironmentProvider _provider;
        public static EnvironmentProvider Provider
        {
            get
            {
                if (_provider == null)
                {
                    _provider = new EnvironmentProvider();
                }
                return _provider;
            }
            set
            {
                _provider = value;
            }
        }

        #endregion

        #region IApp AppCore

        private static IApp _appCore;

        public static IApp AppCore
        {
            get { return _appCore; }
        }

        internal static void InitApp(IApp appCore)
        {
            if (_appCore != null) throw new InvalidOperationException();

            _appCore = appCore;
        }

        #endregion
        #region InitCustomizationPath
        private static PathProvider _pathProvider;

        /// <summary>
        /// 查找文件路径的查找算法提供器。
        /// </summary>
        public static PathProvider CustomerProvider
        {
            get { return _pathProvider; }
        }
        /// <summary>
        /// 提供一个先初始化路径的方法，这个方法可以单独先被调用。
        /// 这样，就可以通过路径找到需要的程序集，其它的初始化才能正常进行。
        /// </summary>
        public static void InitCustomizationPath( )
        {
            if (_pathProvider == null)
            {
                _pathProvider = new PathProvider();

                //分支版本名。
                //同时，这个也是客户化文件夹的名字。
                //分支版本定义，需要重写这个属性。
                string customerDir = ConfigurationHelper.GetAppSettingOrDefault("CustomerDir");
                if (!string.IsNullOrWhiteSpace(customerDir))
                {
                    _pathProvider.AddBranch(customerDir);
                }
            }
        }
        /// <summary>
        /// 获取所有此版本中需要加载的模块Dll集合。
        /// </summary>
        /// <returns></returns>
        public static string[] GetModuleDlls()
        {
            return _pathProvider.MapAllPathes("Module", false);
        }

        #endregion

        #region Path Mapping
        /// <summary>
        /// 使用一个相对的路径来计算绝对路径
        /// MapDllPath("plugins\\")
        /// </summary>
        /// <param name="appRootRelative"></param>
        /// <returns></returns>
        public static string MapDllPath(string appRootRelative)
        {
            return Path.Combine(Provider.DllRootDirectory, appRootRelative);
        }

        /// <summary>
        /// 相对路径转换为绝对路径。
        /// </summary>
        /// <param name="appRootRelative"></param>
        /// <returns></returns>
        public static string ToAbsolute(string appRootRelative)
        {
            return Path.Combine(Provider.RootDirectory, appRootRelative);
        }

        /// <summary>
        /// 把绝对路径转换为相对路径。
        /// </summary>
        /// <param name="absolutePath"></param>
        /// <returns></returns>
        public static string ToRelative(string absolutePath)
        {
            return absolutePath.Replace(Provider.RootDirectory, string.Empty);
        }

        #endregion
        
    }

    public class EnvironmentProvider
    {
        public EnvironmentProvider()
        {
            this.RootDirectory = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
            this.DllRootDirectory = this.RootDirectory;
        }

        /// <summary>
        /// 整个应用程序的根目录
        /// </summary>
        public string RootDirectory { get; set; }

        /// <summary>
        /// Dll 存在的目录路径
        /// （Web 项目的路径是 RootDirectory+"/Bin"）
        /// </summary>
        public string DllRootDirectory { get; set; }

        /// <summary>
        /// 在程序启动时，设置本属性以指示当前程序是否处于调试状态。
        /// </summary>
        public bool IsDebuggingEnabled { get; set; }
    }
}
